package local.xinshi.netmgr.pkg;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

import javax.servlet.http.HttpSession;

public class UserSessions {
    private static final ConcurrentHashMap<String,List<HttpSession>> map = new ConcurrentHashMap<>();

    /**
     * 添加登录用户及其session到映射
     * @param uName 用户名
     * @param e 当前会话
     */
    public static void put(String uName,HttpSession e){
        if(!map.containsKey(uName)){
            List<HttpSession> list = new ArrayList<>();
            list.add(e);
            map.put(uName, list);
        }else{
            map.get(uName).add(e);
        }
    }

    /**
     * 从列表删除session，如果列表已空则连用户也删除
     */
    public static void delSession(String key,HttpSession e){
        List<HttpSession> list = map.get(key);
        if(list != null) {
            list.remove(e);
            if(list.isEmpty()){
                map.remove(key);
            }
        }
    }
    
    /**
     * 注销指定的已登录用户的所有会话
     * @param key 要注销的用户名，如果null或者空字符串则注销所有用户
     */
    public static void invalidate(String key){
        if(key == null || key.isEmpty()){
            for (List<HttpSession> l : map.values()) {
                clearList(l);
            }
            map.clear();
        }else{
            clearList( map.remove(key));
        }
    }
    /**
     * 注销列表的所有session并删除
     */
    private static void clearList(List<HttpSession> list){
        for (HttpSession s : list) {
            s.removeAttribute("login");
            s.invalidate();
        }
        list.clear();
    }
}